Summary ranges

Time: O(N); Space: O(1); medium

Given a sorted integer array without duplicates, return the summary of its ranges.

Example 1:

Input: nums = [0,1,2,4,5,7]

Output: [“0->2”,“4->5”,“7”]

Explanation:

  • 1,2 form a continuous range;

  • 5 form a continuous range.

Example 2:

Input: nums = [0,2,3,4,6,8,9]

Output: [“0”,“2->4”,“6”,“8->9”]

Explanation:

  • 3,4 form a continuous range;

  • 9 form a continuous range.

[11]:
class Solution1(object):
    """
    Time: O(N)
    Space: O(1)
    """
    def summaryRanges(self, nums):
        """
        :type nums: int[]
        :rtype: str[]
        """
        ranges = []
        if not nums:
            return ranges

        start, end = nums[0], nums[0]

        for i in range(1, len(nums) + 1):
            if i < len(nums) and nums[i] == end + 1:
                end = nums[i]
            else:
                interval = str(start)
                if start != end:
                    interval += "->" + str(end)
                ranges.append(interval)
                if i < len(nums):
                    start = end = nums[i]

        return ranges
[12]:
s = Solution1()
nums = [0,1,2,4,5,7]
assert s.summaryRanges(nums) == ["0->2","4->5","7"]
nums = [0,2,3,4,6,8,9]
assert s.summaryRanges(nums) == ["0","2->4","6","8->9"]
[13]:
import itertools
import re

class Solution2:
    """
    Time: O(N)
    Space: O(N)
    """
    def summaryRanges(self, nums):
        """
        :type nums: int[]
        :rtype: str[]
        """
    def summaryRanges(self, nums):
        return [re.sub('->.*>', '->', '->'.join(repr(n) for _, n in g))
            for _, g in itertools.groupby(enumerate(nums), lambda i_n: i_n[1]-i_n[0])]
[14]:
s = Solution2()
nums = [0,1,2,4,5,7]
assert s.summaryRanges(nums) == ["0->2","4->5","7"]
nums = [0,2,3,4,6,8,9]
assert s.summaryRanges(nums) == ["0","2->4","6","8->9"]